home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Pascal / SWar / SWSound.p < prev    next >
Text File  |  1995-06-15  |  4KB  |  155 lines

  1. unit SWSound;
  2.  
  3. interface
  4.     uses
  5. {$IFC UNDEFINED THINK_PASCAL}
  6.         Types, QuickDraw, Events, Menus, Dialogs, Fonts, Resources, Devices,
  7. {$ENDC}
  8.         Sound, Globals;
  9.  
  10.     procedure AInitSnd;
  11.     function ASndPlay (my_snd_Handle: Handle): OSErr;
  12.     procedure AStopSnd;
  13.     function SndIsPlaying: Boolean;
  14.  
  15. implementation
  16.  
  17.     var
  18.         gSndChannel0, gSndChannel1, gSndChannel2: SndChannelPtr;
  19.         gSndPlaying0, gSndPlaying1, gSndPlaying2: Boolean;
  20.         myCommand: SndCommand;
  21.  
  22.         chan: Integer;
  23.  
  24. (*=========================================================*)
  25.  
  26. { const}
  27. {TRUE=   1;}
  28. {FALSE=  0;}
  29. {NIL=    0;}
  30.  
  31.     procedure AInitSnd;
  32.         var
  33.             myErr: OSErr;
  34.     begin
  35.         myErr := noErr;
  36.         if (not gSndIsInitted) then
  37.             begin
  38.                 chan := 0; {?}
  39.                 gSndChannel0 := SndChannelPtr(NewPtrClear(sizeof(SndChannel)));
  40.                 if (gSndChannel0 <> nil) then
  41.                     begin
  42.                         gSndChannel0^.qLength := stdQLength;
  43.                         myErr := SndNewChannel(gSndChannel0, sampledSynth, initMono + initChanLeft, nil);
  44.                     end; (* if *)
  45.                 gSndPlaying0 := FALSE;
  46.  
  47.                 gSndChannel1 := SndChannelPtr(NewPtrClear(sizeof(SndChannel)));
  48.                 if (gSndChannel1 <> nil) then
  49.                     begin
  50.                         gSndChannel1^.qLength := stdQLength;
  51.                         myErr := SndNewChannel(gSndChannel1, sampledSynth, initMono + initChanLeft, nil);
  52.                     end; (* if *)
  53.                 gSndPlaying1 := FALSE;
  54.  
  55.                 gSndChannel2 := SndChannelPtr(NewPtrClear(sizeof(SndChannel)));
  56.                 if (gSndChannel2 <> nil) then
  57.                     begin
  58.                         gSndChannel2^.qLength := stdQLength;
  59.                         myErr := SndNewChannel(gSndChannel2, sampledSynth, initMono + initChanLeft, nil);
  60.                     end; (* if *)
  61.                 gSndPlaying2 := FALSE;
  62.  
  63.                 gSndIsInitted := TRUE;
  64.             end; (* if *)
  65.  
  66.     end; (* AInitSnd() *)
  67.  
  68.     function ASndPlay (my_snd_Handle: Handle): OSErr;
  69.         var
  70.             err: OSErr;
  71.     begin
  72.         err := noErr;
  73.         if (not gSoundOn) then
  74.             exit(ASndPlay);
  75.         chan := chan + 1;
  76.         if ((chan > 2) or (chan < 0)) then
  77.             chan := 0;
  78.  
  79.         case chan of
  80.             0: 
  81.                 begin
  82.                     gSndPlaying0 := FALSE;
  83.                     myCommand.cmd := quietCmd;
  84.                     err := SndDoImmediate(gSndChannel0, myCommand);
  85.                     if err = noErr then
  86.                         begin
  87. {$IFC UNDEFINED THINK_PASCAL}
  88.                             err := SndPlay(gSndChannel0, SndListHandle(My_snd_Handle), TRUE);
  89. {$ELSEC}
  90.                             err := SndPlay(gSndChannel0, My_snd_Handle, TRUE);
  91. {$ENDC}
  92.                             if err = noErr then
  93.                                 begin
  94.                                     gSndPlaying0 := TRUE;
  95.                                 end;
  96.                         end;
  97.                 end;
  98.             1: 
  99.                 begin
  100.                     gSndPlaying1 := FALSE;
  101.                     myCommand.cmd := quietCmd;
  102.                     err := SndDoImmediate(gSndChannel1, myCommand);
  103.                     if err = noErr then
  104.                         begin
  105. {$IFC UNDEFINED THINK_PASCAL}
  106.                             err := SndPlay(gSndChannel1, SndListHandle(My_snd_Handle), TRUE);
  107. {$ELSEC}
  108.                             err := SndPlay(gSndChannel1, My_snd_Handle, TRUE);
  109. {$ENDC}
  110.                             if err = noErr then
  111.                                 begin
  112.                                     gSndPlaying1 := TRUE;
  113.                                 end;
  114.                         end;
  115.                 end;
  116.             2: 
  117.                 begin
  118.                     gSndPlaying2 := FALSE;
  119.                     myCommand.cmd := quietCmd;
  120.                     err := SndDoImmediate(gSndChannel2, myCommand);
  121.                     if err = noErr then
  122.                         begin
  123. {$IFC UNDEFINED THINK_PASCAL}
  124.                             err := SndPlay(gSndChannel2, SndListHandle(My_snd_Handle), TRUE);
  125. {$ELSEC}
  126.                             err := SndPlay(gSndChannel2, My_snd_Handle, TRUE);
  127. {$ENDC}
  128.                             if (err = noErr) then
  129.                                 begin
  130.                                     gSndPlaying2 := TRUE;
  131.                                 end;
  132.                         end;
  133.                 end;
  134.         end; (* case *)
  135.         ASndPlay := err;
  136.     end; {ASndPlay}
  137.  
  138.     procedure AStopSnd;
  139.         var
  140.             myErr: OSErr;
  141.     begin
  142.         myErr := noErr;
  143.         if (gSndIsInitted) then
  144.             begin
  145.                 myErr := SndDisposeChannel(gSndChannel0, TRUE);
  146.                 gSndPlaying0 := FALSE;
  147.                 myErr := SndDisposeChannel(gSndChannel1, TRUE);
  148.                 gSndPlaying1 := FALSE;
  149.                 myErr := SndDisposeChannel(gSndChannel2, TRUE);
  150.                 gSndPlaying2 := FALSE;
  151.                 gSndIsInitted := FALSE;
  152.             end; (* if *)
  153.     end; (* AStopSnd() *)
  154.  
  155. end.